#ifndef _AT_MODULE_H_
#define _AT_MODULE_H_
#include <stdint.h>
#include "at_parser.h"

typedef struct ATModuleConfig_t ATModuleConfig;

//错误定义
typedef enum
{
    MODULE_ERR_NONE,        //无错误
    MODULE_CMD_DEALING,     //指令正在执行
    MODULE_ERR_PWD,         //模块没上电
    MODULE_ERR_SLEEP,       //模块休眠中
    MODLUE_ERR_INIT,        //模块初始化失败
    MODULE_ERR_NO_INIT,     //模块尚未初始化完成
    MODULE_ERR_TCP_NONE,    //TCP未连接
    MODULE_ERR_TCP_ALREADY, //TCP已就绪
    MODULE_ERR_TCP_FAIL,    //TCP指令执行失败
    
    MODULE_ERR_MQTT_NONE,   //MQTT未连接
    MODULE_ERR_MQTT_ALREADY,//MQTT已连接
    MODULE_ERR_MQTT_FAIL,   //MQTT指令执行失败
    
    MODULE_ERR_NO_ACK,      //无回应
    MODULE_ERR_PARAM,       //参数异常
    
}MODULE_ERRPO;

typedef struct
{
    const char*     at_cmd;         //AT指令
    int             at_len;         //AT指令长度
    const char*     at_will;        //希望收到的回复
    uint32_t        timeout;        //超时时间
    uint8_t         resendCnt;      //重发次数
}MODULE_ATCMD_CFG;

//查询IP地址
typedef int(*pMakeCheckIpCMD)(const char buff[],int buffLen,char ip[]);
//获取IP地址
typedef int(*pMakeGetIpCMD)(const char buff[],int buffLen,char ip[]);

//生成连接TCP的AT指令
typedef void(*pMakeTcpConnectCMD)(int id,const char* ip,uint16_t port,char buff[],int buffLen);
//生成断开TCP的AT指令
typedef void(*pMakeTcpDisconnectCMD)(int id,char buff[],int buffLen);
//生成发送TCP数据头的AT指令
typedef void(*pMakeTcpSendCMD)(int id,const uint8_t* pkt,int len,char buff[],int buffLen);
//生成解析TCP接收数据
typedef void(*pParserTcpReceiveCMD)(int* id,const char* pkt,int pktLen,uint8_t* buff,int *len);

//生成MQTT的TCP连接的AT指令
typedef void(*pMakeMqttTCPConnectCMD)(const char* ip,uint16_t port,char buff[],int buffLen);
//生成MQTT的连接AT指令
typedef void(*pMakeMqttConnectCMD)(const char* clientid,const char* username,const char* password,char buff[],int buffLen);
//生成MQTT的SUB AT指令
typedef void(*pMakeMqttSubCMD)(const char* topic,int qos,char buff[],int buffLen);
//生成MQTT的PUB AT指令
typedef void(*pMakeMqttPubCMD)(const char* topic,const char* payload,int payloadLen,int qos,char buff[],int buffLen);
//生成MQTT的PUB  确认推送AT指令
typedef void(*pMakeMqttPubMessageCMD)(const char* topic,const char* payload,int payloadLen,int qos,char buff[],int buffLen);
//生成MQTT的UNSUB AT指令
typedef void(*pMakeMqttUnSubCMD)(const char* topic,int qos,char buff[],int buffLen);
//生成MQTT退出登录帧
typedef void(*pMakeLogoutCMD)(char buff[],int buffLen);
//生成MQTT断开连接帧
typedef void(*pMakeMqttDisconnectCMD)(char buff[],int buffLen);

//生成MQTT接收PUB解析数据
typedef void(*pParserMqttPubCMD)(const char* pkt,int len,char* topic,char* payload,int *payloadLen,int *qos);

//电源上/下电
typedef void(*pModulePowerOn)(int flg);

//模块休眠
typedef void(*pModuleSleep)(void);

//上层处理TCP报文
typedef void(*pTcpReceivePacket)(int id,const uint8_t* pkt,int len);

//上次处理意外TCP连接断开回调函数
typedef void(*pTcpDisconnectURC)(int id);

//上层处理MQTT报文
typedef void(*pMqttPubPacket)(const char* topic,const char* payload,int payloadLen,int qos);


typedef struct
{
    pMakeCheckIpCMD             fpMakeCheckIp;
    const char*                 pcCheckIp;
    const char*                 pcCheckIpSuccess;
    
    pMakeGetIpCMD               fpMakeGetIp;
    const char*                 pcGetIp;
    const char*                 pcGetIpSuccess;
    
    int                         iTimeOut;
}ATModuleIP;

typedef struct
{
    pMakeTcpConnectCMD          fpMakeTcpConnect;
    pMakeTcpDisconnectCMD       fpMakeTcpDisconnect;
    pMakeTcpSendCMD             fpMakeTcpSendHead;
    pMakeTcpSendCMD             fpMakeTcpSend;
    pParserTcpReceiveCMD        fpParserTcpReceive;
    
    const char*                 pcConnectSuccess;
    const char*                 pcSendHead;
    const char*                 pcSendSuccess;
    const char*                 pcDisconnectHead;
    const char*                 pcReceiveURC;
    const char*                 pcDisconnectURC;
    int                         iTimeout;
}ATModuleTCP;

typedef struct
{
    const MODULE_ATCMD_CFG*     pMqttConfig;
    int                         iMqttCfgCmdNum;            //指令个数
    pMakeMqttTCPConnectCMD      fpMakeMqttTcpConnect;
    pMakeMqttConnectCMD         fpMakeMqttConncet;
    pMakeMqttSubCMD             fpMakeMqttSub;
    pMakeMqttPubCMD             fpMakeMqttPub;
    pMakeMqttPubMessageCMD      fpMakeMqttPubMessage;
    pMakeMqttUnSubCMD           fpMakeMqttUnSub;
    pMakeLogoutCMD              fpMakeMqttLogout;
    pMakeMqttDisconnectCMD      fpMakeMqttDisconnect;
    
    pParserMqttPubCMD           fpParserMqttPub;
    const char*                 pcMqttConnectSuccess; 
    const char*                 pcMqttLoginSuccess;
    const char*                 pcMqttPubHead;
    const char*                 pcMqttPubSuccess;
    const char*                 pcMqttSubSuccess;
    const char*                 pcMqttUnsubSuccess;
    const char*                 pcMqttDisconnectSuccess;
    const char*                 pcMqttLogoutSuccess;
    const char*                 pcMqttPubURC;
    const char*                 pcMqttDisconnectURC;
    
    int                         iTimeout;
}ATModuleMqtt;

typedef enum
{
    AT_MODULE_POWER_DOWN,   //下电
    AT_MODULE_SLEEP,        //休眠
    AT_MODULE_IDLE,         //空闲
}AT_MODULE_STATUS;

typedef enum
{
    MODULE_AT_IDLE,
    MODULE_AT_WAIT,
}MODULE_CMD_STATUS;

typedef struct ATModuleConfig_t
{
    const MODULE_ATCMD_CFG*     pInitCmd;               //AT设备初始化的指令
    int                         iInitCmdNum;            //初始化指令个数
    pModulePowerOn              fpPowerOn;              //模块上电
    pModuleSleep                fpSleep;                //模块休眠
    AT_MODULE_STATUS            eModuleStatus;          //模块当前状态
    char                        cIp[64];                 //IP地址
    ATConfig                    atConfig;               //
    const ATModuleIP            *atIpCfg;                //IP指令
    const ATModuleTCP           *atTcpCfg;               //TCP连接指令
    const ATModuleMqtt          *atMqttCfg;              //MQTT连接指令
    
    int                         iIpFlag;                //获取IP标示
    int                         iTcpConnectFlag;        //TCP连接标识
    int                         iMqttConnectFlag;       //MQTT连接表示
    
    pTcpReceivePacket           fpTcpReceiveCallback;   //TCP接收数据回调函数
	pTcpDisconnectURC			fpTcpDisconnectCallback;	//TCP连接意外断开处理回调函数
    pMqttPubPacket              fpMqttPubCallback;      //推送报文回调函数
    
}ATModuleConfig;


//结构体初始化
void module_init(ATModuleConfig* cfg);

//模块上电(阻塞)
void module_poweron(ATModuleConfig* cfg);

//模块开始运行初始化指令
MODULE_ERRPO module_start(ATModuleConfig* cfg);

//模块获取IP信息
const char* module_get_ip(ATModuleConfig* cfg);

//连接TCP服务器
MODULE_ERRPO module_tcp_connect(ATModuleConfig* cfg,const char* ip,uint16_t port);

//发送数据
MODULE_ERRPO module_tcp_send(ATModuleConfig* cfg,const uint8_t* buff,int len);

//读入数据
MODULE_ERRPO module_tcp_read(ATModuleConfig* cfg,uint8_t* buff,int *len,int maxLen,int timeout);

//断开连接
MODULE_ERRPO module_tcp_disconnect(ATModuleConfig* cfg);

//MQTT参数配置
MODULE_ERRPO module_mqtt_config(ATModuleConfig* cfg);

//连接MQTT服务器
MODULE_ERRPO module_mqtt_connect(ATModuleConfig* cfg,const char* ip,uint16_t port);

//登录MQTT服务器
MODULE_ERRPO module_mqtt_login(ATModuleConfig* cfg,const char* clientID,const char* username,const char* passwrod);

//推送
MODULE_ERRPO module_mqtt_pub(ATModuleConfig* cfg,const char* topic,const char* payload,int payloadLen,int qos);

//订阅
MODULE_ERRPO module_mqtt_sub(ATModuleConfig* cfg,const char* topic,int qos);

//取消订阅
MODULE_ERRPO module_mqtt_unsub(ATModuleConfig* cfg,const char* topic,int qos);

//登出
MODULE_ERRPO module_mqtt_logout(ATModuleConfig* cfg);

//主动断开连接
MODULE_ERRPO module_mqtt_disconnect(ATModuleConfig* cfg);

//设置TCP接收数据回调函数
void module_set_tcp_receive_callback(ATModuleConfig* cfg,pTcpReceivePacket f);

//设置TCP连接意外断开处理回调函数
void module_set_tcp_disconnect_callback(ATModuleConfig* cfg,pTcpDisconnectURC f);

//设置MQTT的Pub接收回调函数
void module_set_mqtt_pub_callback(ATModuleConfig* cfg,pMqttPubPacket f);

//AT模块执行循环
void module_loop(ATModuleConfig* cfg);


#endif
